2023/12/231917字符
生成器
生成器:高配版迭代器
function *fn () {
console.log('111');
yield 1; // 产生一个数据
console.log('222');
yield 2;
console.log('333');
// 生成器中的 return 相当于产生最后一个数据,return之后不再生成数据,提前结束生成器函数
}
let generator = fn();
generator.next(); //--> 111 {value: 1, done: false}
generator.next(); //--> 222 {value: 2, done: false}
generator.next(); //--> 333 {value: undefined, done: false}
数组迭代
const arr = [1, 2, 3, 4, 5];
function *createIterator (arr) {
for (const item of arr) {
yield item;
}
}
let iterator = createIterator(arr);
iterator.next(); //--> {value: 1, done: false}
iterator.next(); //--> {value: 2, done: false}
iterator.next(); //--> {value: 3, done: false}
函数累加器
function* fn () { // 生成器函数传参毫无意义
let n = 0
while (true) {
yield n;
n++;
}
}
let iter = fn();
iter.next(); //--> {value: 0, done: false}
iter.next(); //--> {value: 1, done: false}
iter.next(); //--> {value: 2, done: false}
斐波纳列数列
function *createFeiboIterator () {
let prev1 = 1, prev2 = 2, n = 1;
while (true) {
if (n <= 2) {
yield 1;
} else {
const newValue = prev1 + prev2;
yield newValue;
prev2 = prev1;
prev1 = newValue;
}
n++;
}
}
let iter = createFeiboIterator()
iter.next(); //--> {value: 1, done: false}
iter.next(); //--> {value: 1, done: false}
iter.next(); //--> {value: 3, done: false}
生成器嵌套调用
function* fn1() {
yield 1;
yield 2;
}
function* fn2() {
yield *fn1();
yield 3;
yield 4;
}
let iter = fn2();